{
    "cells": [
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "<center>\n",
                "    <p style=\"text-align:center\">\n",
                "        <img alt=\"phoenix logo\" src=\"https://storage.googleapis.com/arize-phoenix-assets/assets/phoenix-logo-light.svg\" width=\"200\"/>\n",
                "        <br>\n",
                "        <a href=\"https://docs.arize.com/phoenix/\">Docs</a>\n",
                "        |\n",
                "        <a href=\"https://github.com/Arize-ai/phoenix\">GitHub</a>\n",
                "        |\n",
                "        <a href=\"https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q\">Community</a>\n",
                "    </p>\n",
                "</center>\n",
                "<h1 align=\"center\">Hallucination Classification Evals</h1>\n",
                "\n",
                "The purpose of this notebook is:\n",
                "\n",
                "- to evaluate the performance of an LLM-assisted approach to detecting hallucinations,\n",
                "- to provide an experimental framework for users to iterate and improve on the default classification template.\n",
                "\n",
                "## Install Dependencies and Import Libraries"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 1,
            "metadata": {},
            "outputs": [],
            "source": [
                "#####################\n",
                "## N_EVAL_SAMPLE_SIZE\n",
                "#####################\n",
                "# Eval sample size determines the run time\n",
                "# 100 samples: GPT-4 ~ 80 sec / GPT-3.5 ~ 40 sec\n",
                "# 1,000 samples: GPT-4 ~15-17 min / GPT-3.5 ~ 6-7min (depending on retries)\n",
                "# 10,000 samples GPT-4 ~170 min / GPT-3.5 ~ 70min\n",
                "N_EVAL_SAMPLE_SIZE = 100"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 2,
            "metadata": {},
            "outputs": [],
            "source": [
                "!pip install -qq \"arize-phoenix-evals>=0.0.5\" \"openai>=1\" ipython matplotlib pycm scikit-learn tiktoken nest_asyncio"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "ℹ️ To enable async request submission in notebook environments like Jupyter or Google Colab, optionally use `nest_asyncio`. `nest_asyncio` globally patches `asyncio` to enable event loops to be re-entrant. This is not required for non-notebook environments.\n",
                "\n",
                "Without `nest_asyncio`, eval submission can be much slower, depending on your organization's rate limits. Speed increases of about 5x are typical."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 3,
            "metadata": {},
            "outputs": [],
            "source": [
                "import nest_asyncio\n",
                "\n",
                "nest_asyncio.apply()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 4,
            "metadata": {},
            "outputs": [],
            "source": [
                "import os\n",
                "from getpass import getpass\n",
                "\n",
                "import matplotlib.pyplot as plt\n",
                "import openai\n",
                "import pandas as pd\n",
                "from phoenix.evals import (\n",
                "    HALLUCINATION_PROMPT_RAILS_MAP,\n",
                "    HALLUCINATION_PROMPT_TEMPLATE,\n",
                "    OpenAIModel,\n",
                "    download_benchmark_dataset,\n",
                "    llm_classify,\n",
                ")\n",
                "from pycm import ConfusionMatrix\n",
                "from sklearn.metrics import classification_report\n",
                "\n",
                "pd.set_option(\"display.max_colwidth\", None)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Download Benchmark Dataset\n",
                "\n",
                "We'll evaluate the evaluation system consisting of an LLM model and settings in addition to an evaluation prompt template against benchmark datasets of queries and retrieved documents with ground-truth relevance labels. Currently supported datasets include \"halueval_qa_data\" from the HaluEval benchmark:\n",
                "\n",
                "- https://arxiv.org/abs/2305.11747\n",
                "- https://github.com/RUCAIBox/HaluEval"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 5,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/html": [
                            "<div>\n",
                            "<style scoped>\n",
                            "    .dataframe tbody tr th:only-of-type {\n",
                            "        vertical-align: middle;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe tbody tr th {\n",
                            "        vertical-align: top;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe thead th {\n",
                            "        text-align: right;\n",
                            "    }\n",
                            "</style>\n",
                            "<table border=\"1\" class=\"dataframe\">\n",
                            "  <thead>\n",
                            "    <tr style=\"text-align: right;\">\n",
                            "      <th></th>\n",
                            "      <th>reference</th>\n",
                            "      <th>query</th>\n",
                            "      <th>response</th>\n",
                            "      <th>is_hallucination</th>\n",
                            "    </tr>\n",
                            "  </thead>\n",
                            "  <tbody>\n",
                            "    <tr>\n",
                            "      <th>0</th>\n",
                            "      <td>() is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.</td>\n",
                            "      <td>Can  Fuyang and Gaozhou be found in the same province?</td>\n",
                            "      <td>no</td>\n",
                            "      <td>False</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>1</th>\n",
                            "      <td>() is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.</td>\n",
                            "      <td>Can  Fuyang and Gaozhou be found in the same province?</td>\n",
                            "      <td>Yes, Fuyang and Gaozhou are in the same province.</td>\n",
                            "      <td>True</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>2</th>\n",
                            "      <td>\"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&amp;B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.</td>\n",
                            "      <td>808 peaked at number eight on what?</td>\n",
                            "      <td>Billboard\" Hot 100</td>\n",
                            "      <td>False</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>3</th>\n",
                            "      <td>\"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&amp;B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.</td>\n",
                            "      <td>808 peaked at number eight on what?</td>\n",
                            "      <td>\"808\" peaked at number nine on \"Billboard\" Hot 100.</td>\n",
                            "      <td>True</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>4</th>\n",
                            "      <td>\"Arms\" then made a comeback in 2017 reaching #36 on the iTunes chart passing Auli'i Cravalho's \"How Far I'll Go\" from the Disney movie \"Moana\" (2017).Moana ( ) is a 2016 American 3D computer-animated musical fantasy-adventure film produced by Walt Disney Animation Studios and released by Walt Disney Pictures.</td>\n",
                            "      <td>Arms is a song by American singer-songwriter Christina Perri, in 2017, it passed Auli'i Cravalho's, \"How Far I'll Go\" from which 2016, American 3D computer-animated Disney movie?</td>\n",
                            "      <td>Moana</td>\n",
                            "      <td>False</td>\n",
                            "    </tr>\n",
                            "  </tbody>\n",
                            "</table>\n",
                            "</div>"
                        ],
                        "text/plain": [
                            "                                                                                                                                                                                                                                                                                                                                                reference  \\\n",
                            "0                                                                                                                                                                                                           () is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.   \n",
                            "1                                                                                                                                                                                                           () is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.   \n",
                            "2   \"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.   \n",
                            "3   \"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.   \n",
                            "4                                  \"Arms\" then made a comeback in 2017 reaching #36 on the iTunes chart passing Auli'i Cravalho's \"How Far I'll Go\" from the Disney movie \"Moana\" (2017).Moana ( ) is a 2016 American 3D computer-animated musical fantasy-adventure film produced by Walt Disney Animation Studios and released by Walt Disney Pictures.   \n",
                            "\n",
                            "                                                                                                                                                                                query  \\\n",
                            "0                                                                                                                              Can  Fuyang and Gaozhou be found in the same province?   \n",
                            "1                                                                                                                              Can  Fuyang and Gaozhou be found in the same province?   \n",
                            "2                                                                                                                                                 808 peaked at number eight on what?   \n",
                            "3                                                                                                                                                 808 peaked at number eight on what?   \n",
                            "4  Arms is a song by American singer-songwriter Christina Perri, in 2017, it passed Auli'i Cravalho's, \"How Far I'll Go\" from which 2016, American 3D computer-animated Disney movie?   \n",
                            "\n",
                            "                                              response  is_hallucination  \n",
                            "0                                                   no             False  \n",
                            "1    Yes, Fuyang and Gaozhou are in the same province.              True  \n",
                            "2                                   Billboard\" Hot 100             False  \n",
                            "3  \"808\" peaked at number nine on \"Billboard\" Hot 100.              True  \n",
                            "4                                                Moana             False  "
                        ]
                    },
                    "execution_count": 5,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "df = download_benchmark_dataset(\n",
                "    task=\"binary-hallucination-classification\", dataset_name=\"halueval_qa_data\"\n",
                ")\n",
                "df.head()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Display Binary Hallucination Classification Template\n",
                "\n",
                "View the default template used to classify hallucinations. You can tweak this template and evaluate its performance relative to the default."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 6,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "\n",
                        "In this task, you will be presented with a query, a reference text and an answer. The answer is\n",
                        "generated to the question based on the reference text. The answer may contain false information, you\n",
                        "must use the reference text to determine if the answer to the question contains false information,\n",
                        "if the answer is a hallucination of facts. Your objective is to determine whether the reference text\n",
                        "contains factual information and is not a hallucination. A 'hallucination' in this context refers to\n",
                        "an answer that is not based on the reference text or assumes information that is not available in\n",
                        "the reference text. Your response should be a single word: either \"factual\" or \"hallucinated\", and\n",
                        "it should not include any other text or characters. \"hallucinated\" indicates that the answer\n",
                        "provides factually inaccurate information to the query based on the reference text. \"factual\"\n",
                        "indicates that the answer to the question is correct relative to the reference text, and does not\n",
                        "contain made up information. Please read the query and reference text carefully before determining\n",
                        "your response.\n",
                        "\n",
                        "    [BEGIN DATA]\n",
                        "    ************\n",
                        "    [Query]: {input}\n",
                        "    ************\n",
                        "    [Reference text]: {reference}\n",
                        "    ************\n",
                        "    [Answer]: {output}\n",
                        "    ************\n",
                        "    [END DATA]\n",
                        "\n",
                        "    Is the answer above factual or hallucinated based on the query and reference text?\n",
                        "\n"
                    ]
                }
            ],
            "source": [
                "print(HALLUCINATION_PROMPT_TEMPLATE)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Template variables:\n",
                "- **input** : The question or prompt asked on the context data.\n",
                "- **reference** : The context data used to answer the question\n",
                "- **output** : The answer generated from the context data, we are checking this answer for halluciations relative to the reference context"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Configure the LLM\n",
                "\n",
                "Configure your OpenAI API key."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 7,
            "metadata": {},
            "outputs": [],
            "source": [
                "if not (openai_api_key := os.getenv(\"OPENAI_API_KEY\")):\n",
                "    openai_api_key = getpass(\"🔑 Enter your OpenAI API key: \")\n",
                "openai.api_key = openai_api_key\n",
                "os.environ[\"OPENAI_API_KEY\"] = openai_api_key"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Benchmark Dataset Sample\n",
                "Sample size determines run time\n",
                "Recommend iterating small: 100 samples\n",
                "Then increasing to large test set"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 8,
            "metadata": {},
            "outputs": [],
            "source": [
                "df = (\n",
                "    df.sample(n=N_EVAL_SAMPLE_SIZE)\n",
                "    .reset_index(drop=True)\n",
                "    .rename(columns={\"query\": \"input\", \"response\": \"output\"})\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## LLM Evals: hallucination Classifications GPT-4\n",
                "Run hallucination against a subset of the data."
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Instantiate the LLM and set parameters."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 9,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                }
            ],
            "source": [
                "model = OpenAIModel(\n",
                "    model_name=\"gpt-4\",\n",
                "    temperature=0.0,\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 10,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/plain": [
                            "\"Hello! I'm working perfectly. How can I assist you today?\""
                        ]
                    },
                    "execution_count": 10,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "model(\"Hello world, this is a test if you are working?\")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 11,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "14e77ea7bc4e4551a74bb4d5a086ca8f",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                },
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "Worker timeout, requeuing\n"
                    ]
                }
            ],
            "source": [
                "# The rails fore the output to specific values of the template\n",
                "# It will remove text such as \",,,\" or \"...\", anything not the\n",
                "# binary value expected from the template\n",
                "rails = list(HALLUCINATION_PROMPT_RAILS_MAP.values())\n",
                "hallucination_classifications = llm_classify(\n",
                "    dataframe=df, template=HALLUCINATION_PROMPT_TEMPLATE, model=model, rails=rails, concurrency=20\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "\n",
                "\n",
                "Evaluate the predictions against human-labeled ground-truth hallucination labels."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 12,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "hallucinated       0.97      0.75      0.85        48\n",
                        "     factual       0.81      0.98      0.89        52\n",
                        "\n",
                        "    accuracy                           0.87       100\n",
                        "   macro avg       0.89      0.87      0.87       100\n",
                        "weighted avg       0.89      0.87      0.87       100\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 12,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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jIiIiLQah8mIiIiItAMrQ0RERKSCBobJyknNhckQERERKeMwGREREZF2YGWIiIiIlIlEGlhNVj4qQ0yGiIiISJkWLa0vH1ESERERlRJWhoiIiEiZFk2gZjJEREREyrRomIzJEBERESnTospQ+UjZiIiIiEoJK0NERESkjMNkREREpNU4TEZERESkHVgZIiIiIiUikQgiLakMMRkiIiIiJdqUDHGYjIiIiLQaK0NERESkTPT/raR9lANMhoiIiEgJh8mIiIiItAQrQ0RERKREmypDTIaIiIhICZMhIiIi0mralAxxzhARERFpNVaGiIiISBmX1hMREZE24zAZERERkZZgZYiIiIiUiETQQGVIM7GUNiZDREREpEQEDQyTlZNsiMNkREREpNVYGSIiIiIlnEBNRERE2k2koU1NS5cuhaurKwwMDNC4cWOcO3futcdHRkbC09MThoaGcHZ2xtixY/HixQu1zslkiIiIiN4LW7duRVBQEGbMmIGLFy+idu3a6NChA1JTU1Uev2nTJnzzzTeYMWMGbty4gdWrV2Pr1q2YMmWKWudlMkRERETK/j9MVpJN3WGyBQsWYPDgwejfvz+qV6+O5cuXw8jICGvWrFF5/KlTp9CsWTP069cPrq6uaN++Pfr27fvGatLLmAwRERGRkpImQurOOcrLy8OFCxfg6+srbxOLxfD19cXp06dVvqdp06a4cOGCPPm5d+8efv/9d3Tu3Fmta+UEaiIiIlKiiQnURe/PzMxUaJdIJJBIJApt6enpkEqlsLe3V2i3t7fHzZs3Vfbfr18/pKeno3nz5hAEAQUFBfjqq684TEZERETvF2dnZ5ibm8u3iIgIjfQbExOD8PBw/PDDD7h48SJ27tyJvXv3YubMmWr1w8oQERERKdPgg1oTExNhZmYmb365KgQANjY20NHRQUpKikJ7SkoKHBwcVHY/ffp0fPnllxg0aBAAwMvLC8+ePcOQIUMwdepUiMXFq/mwMkRERERKNDlnyMzMTGFTlQzp6+ujfv36OHTokLxNJpPh0KFD8Pb2VhljTk6OUsKjo6MDABAEodjXysoQERERvReCgoIQEBCABg0aoFGjRoiMjMSzZ8/Qv39/AIC/vz8qVKggH2br1q0bFixYgLp166Jx48a4c+cOpk+fjm7dusmTouJgMkRERERKNDmBurj69OmDtLQ0BAcH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",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"is_hallucination\"].map(HALLUCINATION_PROMPT_RAILS_MAP).tolist()\n",
                "print(classification_report(true_labels, hallucination_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels,\n",
                "    predict_vector=hallucination_classifications,\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## Classifications with explanations\n",
                "\n",
                "When evaluating a dataset for hallucinations, it can be useful to know why the LLM classified a response as a hallucination or not. The following code block runs `llm_classify` with explanations turned on so that we can inspect why the LLM made the classification it did. There is speed tradeoff since more tokens is being generated but it can be highly informative when troubleshooting."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 13,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "Using prompt:\n",
                        "\n",
                        "\n",
                        "In this task, you will be presented with a query, a reference text and an answer. The answer is\n",
                        "generated to the question based on the reference text. The answer may contain false information, you\n",
                        "must use the reference text to determine if the answer to the question contains false information,\n",
                        "if the answer is a hallucination of facts. Your objective is to determine whether the reference text\n",
                        "contains factual information and is not a hallucination. A 'hallucination' in this context refers to\n",
                        "an answer that is not based on the reference text or assumes information that is not available in\n",
                        "the reference text.\n",
                        "\n",
                        "    [BEGIN DATA]\n",
                        "    ************\n",
                        "    [Query]: {input}\n",
                        "    ************\n",
                        "    [Reference text]: {reference}\n",
                        "    ************\n",
                        "    [Answer]: {output}\n",
                        "    ************\n",
                        "    [END DATA]\n",
                        "\n",
                        "    Is the answer above factual or hallucinated based on the query and reference text?\n",
                        "\n",
                        "Please read the query, reference text and answer carefully, then write out in a step by step manner\n",
                        "an EXPLANATION to show how to determine if the answer is \"factual\" or \"hallucinated\". Avoid simply\n",
                        "stating the correct answer at the outset. Your response LABEL should be a single word: either\n",
                        "\"factual\" or \"hallucinated\", and it should not include any other text or characters. \"hallucinated\"\n",
                        "indicates that the answer provides factually inaccurate information to the query based on the\n",
                        "reference text. \"factual\" indicates that the answer to the question is correct relative to the\n",
                        "reference text, and does not contain made up information.\n",
                        "\n",
                        "Example response:\n",
                        "************\n",
                        "EXPLANATION: An explanation of your reasoning for why the label is \"factual\" or \"hallucinated\"\n",
                        "LABEL: \"factual\" or \"hallucinated\"\n",
                        "************\n",
                        "\n",
                        "EXPLANATION:\n",
                        "OpenAI invocation parameters: {'model': 'gpt-4', 'temperature': 0.0, 'max_tokens': 256, 'frequency_penalty': 0, 'presence_penalty': 0, 'top_p': 1, 'n': 1, 'timeout': None}\n"
                    ]
                },
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "2dc2622ed9804e3abcdd905b0939c18e",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/5 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                },
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "- Snapped 'factual' to rail: factual\n",
                        "- Snapped 'factual' to rail: factual\n",
                        "- Snapped 'factual' to rail: factual\n",
                        "- Snapped 'factual' to rail: factual\n",
                        "- Snapped 'hallucinated' to rail: hallucinated\n"
                    ]
                }
            ],
            "source": [
                "small_df_sample = df.copy().sample(n=5).reset_index(drop=True)\n",
                "hallucination_classifications_df = llm_classify(\n",
                "    dataframe=small_df_sample,\n",
                "    template=HALLUCINATION_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=rails,\n",
                "    provide_explanation=True,\n",
                "    verbose=True,\n",
                "    concurrency=20,\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 14,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "text/html": [
                            "<div>\n",
                            "<style scoped>\n",
                            "    .dataframe tbody tr th:only-of-type {\n",
                            "        vertical-align: middle;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe tbody tr th {\n",
                            "        vertical-align: top;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe thead th {\n",
                            "        text-align: right;\n",
                            "    }\n",
                            "</style>\n",
                            "<table border=\"1\" class=\"dataframe\">\n",
                            "  <thead>\n",
                            "    <tr style=\"text-align: right;\">\n",
                            "      <th></th>\n",
                            "      <th>input</th>\n",
                            "      <th>reference</th>\n",
                            "      <th>output</th>\n",
                            "      <th>is_hallucination</th>\n",
                            "      <th>label</th>\n",
                            "      <th>explanation</th>\n",
                            "    </tr>\n",
                            "  </thead>\n",
                            "  <tbody>\n",
                            "    <tr>\n",
                            "      <th>0</th>\n",
                            "      <td>What does Georges Méliès and Alexander Kluge have in common?</td>\n",
                            "      <td>Marie-Georges-Jean Méliès, known as Georges Méliès ( ; ] ; 8 December 1861 – 21 January 1938), was a French illusionist and film director who led many technical and narrative developments in the earliest days of cinema.Alexander Kluge (born 14 February 1932) is a German author, philosopher, academic and film director.</td>\n",
                            "      <td>film director.</td>\n",
                            "      <td>False</td>\n",
                            "      <td>factual</td>\n",
                            "      <td>The query asks what Georges Méliès and Alexander Kluge have in common. The reference text states that Georges Méliès was a French illusionist and film director, and Alexander Kluge is a German author, philosopher, academic and film director. The commonality between them, as stated in the reference text, is that they are both film directors. Therefore, the answer 'film director' is based on the information provided in the reference text.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>1</th>\n",
                            "      <td>Who was the mother of the woman who made the Star Spangled banner flag hoisted over a city that was designated a national park in 1925?</td>\n",
                            "      <td>Mary Pickersgill (born Mary Young; February 12, 1776 – October 4, 1857), was the maker of the Star Spangled Banner Flag hoisted over Fort McHenry during the Battle of Baltimore in the War of 1812. The daughter of another noted flag maker, Rebecca Young, Pickersgill learned her craft from her mother, and, in 1813, was commissioned by Major George Armistead to make a flag for Baltimore's Fort McHenry that was so large that the British would have no difficulty seeing it from a great distance.Fort McHenry, in Baltimore, Maryland, is a historical American coastal pentagonal bastion fort best known for its role in the War of 1812, when it successfully defended Baltimore Harbor from an attack by the British navy from the Chesapeake Bay September 13–14, 1814.</td>\n",
                            "      <td>Rebecca Young</td>\n",
                            "      <td>False</td>\n",
                            "      <td>factual</td>\n",
                            "      <td>The query asks for the mother of Mary Pickersgill, the woman who made the Star Spangled Banner flag. The reference text clearly states that Mary Pickersgill's mother is Rebecca Young. Therefore, the answer 'Rebecca Young' is based on the information provided in the reference text and is factual.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>2</th>\n",
                            "      <td>What is the name of the soap opera with the character Tasha Andrews?</td>\n",
                            "      <td>Natasha \"Tasha\" Hunter (also Andrews) is a fictional character from the Australian soap opera \"Home and Away\", played by Isabel Lucas.Isabel Lucas (born 29 January 1985) is an Australian actress, and model. She is best known for her roles in \"Home and Away\" (2003–2006), \"\" (2009), \"Daybreakers\" (2009), \"The Pacific\" (2010), \"Immortals\" (2011), and \"Red Dawn\" (2012).</td>\n",
                            "      <td>\"Home and Away\"</td>\n",
                            "      <td>False</td>\n",
                            "      <td>factual</td>\n",
                            "      <td>The query asks for the name of the soap opera that features the character Tasha Andrews. The reference text clearly states that Tasha Andrews is a character from the Australian soap opera 'Home and Away'. The answer provided is 'Home and Away', which matches the information given in the reference text. Therefore, the answer is based on the reference text and does not assume any information that is not available in the reference text.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>3</th>\n",
                            "      <td>Ettore or Edoardo Ettore Forti was an Italian painter, who was prolific in depicting realistic Neo-Pompeian scenes of Ancient Roman life and events, these subjects were popular in the late-Victorian period, as exemplified by the popularity of Lawrence Alma-Tadema, born in Dronrijp, in which country?</td>\n",
                            "      <td>These subjects were popular in the late-Victorian period, as exemplified by the popularity of Lawrence Alma-Tadema, as an example. Born in Dronrijp, the Netherlands, and trained at the Royal Academy of Antwerp, Belgium, he settled in England in 1870 and spent the rest of his life there.</td>\n",
                            "      <td>Ettore Forti was an Italian painter.</td>\n",
                            "      <td>True</td>\n",
                            "      <td>hallucinated</td>\n",
                            "      <td>The answer states that 'Ettore Forti was an Italian painter.' However, the query is asking about the birthplace of Lawrence Alma-Tadema, not about Ettore Forti. The reference text provides information about Lawrence Alma-Tadema being born in Dronrijp, the Netherlands. Therefore, the answer is not relevant to the query and does not provide the correct information based on the reference text.</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>4</th>\n",
                            "      <td>What specific college in Delaware did Jamin Elliott play football with Matt Nagy?</td>\n",
                            "      <td>Elliott caught 66 passes for 745 yards and 12 touchdowns for the Georgia Force during the 2006 season where he was once again reunited with his former Delaware quarterback Matt Nagy. He played college football for the University of Delaware, and subsequently was signed as a street free agent by the New York Dragons of the Arena Football League (AFL).</td>\n",
                            "      <td>University of Delaware</td>\n",
                            "      <td>False</td>\n",
                            "      <td>factual</td>\n",
                            "      <td>The query asks for the specific college in Delaware where Jamin Elliott played football with Matt Nagy. The reference text mentions that Elliott played college football for the University of Delaware and was reunited with his former Delaware quarterback Matt Nagy. This indicates that they both played football together at the University of Delaware. Therefore, the answer 'University of Delaware' is based on the information provided in the reference text.</td>\n",
                            "    </tr>\n",
                            "  </tbody>\n",
                            "</table>\n",
                            "</div>"
                        ],
                        "text/plain": [
                            "                                                                                                                                                                                                                                                                                                          input  \\\n",
                            "0                                                                                                                                                                                                                                                  What does Georges Méliès and Alexander Kluge have in common?   \n",
                            "1                                                                                                                                                                       Who was the mother of the woman who made the Star Spangled banner flag hoisted over a city that was designated a national park in 1925?   \n",
                            "2                                                                                                                                                                                                                                          What is the name of the soap opera with the character Tasha Andrews?   \n",
                            "3  Ettore or Edoardo Ettore Forti was an Italian painter, who was prolific in depicting realistic Neo-Pompeian scenes of Ancient Roman life and events, these subjects were popular in the late-Victorian period, as exemplified by the popularity of Lawrence Alma-Tadema, born in Dronrijp, in which country?   \n",
                            "4                                                                                                                                                                                                                             What specific college in Delaware did Jamin Elliott play football with Matt Nagy?   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   reference  \\\n",
                            "0                                                                                                                                                                                                                                                                                                                                                                                                                                                            Marie-Georges-Jean Méliès, known as Georges Méliès ( ; ] ; 8 December 1861 – 21 January 1938), was a French illusionist and film director who led many technical and narrative developments in the earliest days of cinema.Alexander Kluge (born 14 February 1932) is a German author, philosopher, academic and film director.   \n",
                            "1  Mary Pickersgill (born Mary Young; February 12, 1776 – October 4, 1857), was the maker of the Star Spangled Banner Flag hoisted over Fort McHenry during the Battle of Baltimore in the War of 1812. The daughter of another noted flag maker, Rebecca Young, Pickersgill learned her craft from her mother, and, in 1813, was commissioned by Major George Armistead to make a flag for Baltimore's Fort McHenry that was so large that the British would have no difficulty seeing it from a great distance.Fort McHenry, in Baltimore, Maryland, is a historical American coastal pentagonal bastion fort best known for its role in the War of 1812, when it successfully defended Baltimore Harbor from an attack by the British navy from the Chesapeake Bay September 13–14, 1814.   \n",
                            "2                                                                                                                                                                                                                                                                                                                                                                                                           Natasha \"Tasha\" Hunter (also Andrews) is a fictional character from the Australian soap opera \"Home and Away\", played by Isabel Lucas.Isabel Lucas (born 29 January 1985) is an Australian actress, and model. She is best known for her roles in \"Home and Away\" (2003–2006), \"\" (2009), \"Daybreakers\" (2009), \"The Pacific\" (2010), \"Immortals\" (2011), and \"Red Dawn\" (2012).   \n",
                            "3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            These subjects were popular in the late-Victorian period, as exemplified by the popularity of Lawrence Alma-Tadema, as an example. Born in Dronrijp, the Netherlands, and trained at the Royal Academy of Antwerp, Belgium, he settled in England in 1870 and spent the rest of his life there.   \n",
                            "4                                                                                                                                                                                                                                                                                                                                                                                                                           Elliott caught 66 passes for 745 yards and 12 touchdowns for the Georgia Force during the 2006 season where he was once again reunited with his former Delaware quarterback Matt Nagy. He played college football for the University of Delaware, and subsequently was signed as a street free agent by the New York Dragons of the Arena Football League (AFL).   \n",
                            "\n",
                            "                                 output  is_hallucination         label  \\\n",
                            "0                        film director.             False       factual   \n",
                            "1                         Rebecca Young             False       factual   \n",
                            "2                       \"Home and Away\"             False       factual   \n",
                            "3  Ettore Forti was an Italian painter.              True  hallucinated   \n",
                            "4                University of Delaware             False       factual   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                 explanation  \n",
                            "0                   The query asks what Georges Méliès and Alexander Kluge have in common. The reference text states that Georges Méliès was a French illusionist and film director, and Alexander Kluge is a German author, philosopher, academic and film director. The commonality between them, as stated in the reference text, is that they are both film directors. Therefore, the answer 'film director' is based on the information provided in the reference text.  \n",
                            "1                                                                                                                                                                   The query asks for the mother of Mary Pickersgill, the woman who made the Star Spangled Banner flag. The reference text clearly states that Mary Pickersgill's mother is Rebecca Young. Therefore, the answer 'Rebecca Young' is based on the information provided in the reference text and is factual.  \n",
                            "2                      The query asks for the name of the soap opera that features the character Tasha Andrews. The reference text clearly states that Tasha Andrews is a character from the Australian soap opera 'Home and Away'. The answer provided is 'Home and Away', which matches the information given in the reference text. Therefore, the answer is based on the reference text and does not assume any information that is not available in the reference text.  \n",
                            "3                                                                  The answer states that 'Ettore Forti was an Italian painter.' However, the query is asking about the birthplace of Lawrence Alma-Tadema, not about Ettore Forti. The reference text provides information about Lawrence Alma-Tadema being born in Dronrijp, the Netherlands. Therefore, the answer is not relevant to the query and does not provide the correct information based on the reference text.  \n",
                            "4  The query asks for the specific college in Delaware where Jamin Elliott played football with Matt Nagy. The reference text mentions that Elliott played college football for the University of Delaware and was reunited with his former Delaware quarterback Matt Nagy. This indicates that they both played football together at the University of Delaware. Therefore, the answer 'University of Delaware' is based on the information provided in the reference text.  "
                        ]
                    },
                    "execution_count": 14,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "# Let's view the data\n",
                "merged_df = pd.merge(\n",
                "    small_df_sample, hallucination_classifications_df, left_index=True, right_index=True\n",
                ")\n",
                "merged_df[[\"input\", \"reference\", \"output\", \"is_hallucination\", \"label\", \"explanation\"]].head()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "## LLM Evals: hallucination Classifications GPT-3.5\n",
                "Run hallucination against a subset of the data."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 15,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                }
            ],
            "source": [
                "model = OpenAIModel(model_name=\"gpt-3.5-turbo\", temperature=0.0, request_timeout=20)"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 16,
            "metadata": {},
            "outputs": [
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "1215e5c20ff04f77b2647094dc41d2e0",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "rails = list(HALLUCINATION_PROMPT_RAILS_MAP.values())\n",
                "hallucination_classifications = llm_classify(\n",
                "    dataframe=df, template=HALLUCINATION_PROMPT_TEMPLATE, model=model, rails=rails, concurrency=20\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 17,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "hallucinated       0.82      0.75      0.78        48\n",
                        "     factual       0.79      0.85      0.81        52\n",
                        "\n",
                        "    accuracy                           0.80       100\n",
                        "   macro avg       0.80      0.80      0.80       100\n",
                        "weighted avg       0.80      0.80      0.80       100\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 17,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"is_hallucination\"].map(HALLUCINATION_PROMPT_RAILS_MAP).tolist()\n",
                "\n",
                "print(classification_report(true_labels, hallucination_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels,\n",
                "    predict_vector=hallucination_classifications,\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "# Preview: GPT-4 Turbo"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 18,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                },
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "da06510d26224adab49403057df5f3d3",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "rails = list(HALLUCINATION_PROMPT_RAILS_MAP.values())\n",
                "hallucination_classifications = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=HALLUCINATION_PROMPT_TEMPLATE,\n",
                "    model=OpenAIModel(model_name=\"gpt-4-turbo-preview\", temperature=0.0),\n",
                "    rails=rails,\n",
                "    concurrency=20,\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 19,
            "metadata": {},
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "hallucinated       0.94      0.71      0.81        48\n",
                        "     factual       0.78      0.96      0.86        52\n",
                        "\n",
                        "    accuracy                           0.84       100\n",
                        "   macro avg       0.86      0.83      0.84       100\n",
                        "weighted avg       0.86      0.84      0.84       100\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 19,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "print(classification_report(true_labels, hallucination_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels,\n",
                "    predict_vector=hallucination_classifications,\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        }
    ],
    "metadata": {
        "kernelspec": {
            "display_name": "Python 3 (ipykernel)",
            "language": "python",
            "name": "python3"
        },
        "language_info": {
            "codemirror_mode": {
                "name": "ipython",
                "version": 3
            },
            "file_extension": ".py",
            "mimetype": "text/x-python",
            "name": "python",
            "nbconvert_exporter": "python",
            "pygments_lexer": "ipython3",
            "version": "3.10.3"
        }
    },
    "nbformat": 4,
    "nbformat_minor": 4
}
